home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / drivers / punchout.c < prev    next >
C/C++ Source or Header  |  2000-05-04  |  41KB  |  1,155 lines

  1. /***************************************************************************
  2.  
  3. Punch Out memory map (preliminary)
  4. Arm Wrestling runs on about the same hardware, but the video board is different.
  5.  
  6. TODO:
  7. - The money bag is misplaced in armwrest bonus rounds.
  8.  
  9.  
  10. driver by Nicola Salmoria
  11.  
  12.  
  13. main CPU:
  14.  
  15. 0000-bfff ROM
  16. c000-c3ff NVRAM
  17. d000-d7ff RAM
  18. d800-dfff Video RAM (info screen)
  19. e000-e7ff Video RAM (opponent)
  20. e800-efff Video RAM (player)
  21. f000-f03f Background row scroll (low/high couples)
  22. f000-ffff Video RAM (background)
  23.  
  24. memory mapped ports:
  25. write:
  26. dfe0-dfef ??
  27.  
  28. dff0      big sprite #1 zoom low 8 bits
  29. dff1      big sprite #1 zoom high 4 bits
  30. dff2      big sprite #1 x pos low 8 bits
  31. dff3      big sprite #1 x pos high 4 bits
  32. dff4      big sprite #1 y pos low 8 bits
  33. dff5      big sprite #1 y pos high bit
  34. dff6      big sprite #1 x flip (bit 0)
  35. dff7      big sprite #1 bit 0: show on top monitor; bit 1: show on bottom monitor
  36.  
  37. dff8      big sprite #2 x pos low 8 bits
  38. dff9      big sprite #2 x pos high bit
  39. dffa      big sprite #2 y pos low 8 bits
  40. dffb      big sprite #2 y pos high bit
  41. dffc      big sprite #2 x flip (bit 0)
  42. dffd      palette bank (bit 0 = bottom monitor bit 1 = top monitor)
  43.  
  44. I/O
  45. read:
  46. 00        IN0
  47. 01        IN1
  48. 02        DSW0
  49. 03        DSW1 (bit 4: VLM5030 busy signal)
  50.  
  51. write:
  52. 00        to 2A03 #1 IN0 (unpopulated)
  53. 01        to 2A03 #1 IN1 (unpopulated)
  54. 02        to 2A03 #2 IN0
  55. 03        to 2A03 #2 IN1
  56. 04        to VLM5030
  57. 08        NMI enable + watchdog reset
  58. 09        watchdog reset
  59. 0a        ? latched into Z80 BUS RQ
  60. 0b        to 2A03 #1 and #2 RESET
  61. 0c        to VLM5030 RESET
  62. 0d        to VLM5030 START
  63. 0e        to VLM5030 VCU
  64. 0f        enable NVRAM ?
  65.  
  66. sound CPU:
  67. the sound CPU is a 2A03, which is a modified 6502 with built-in input ports
  68. and two (analog?) outputs. The input ports are memory mapped at 4016-4017;
  69. the outputs are more complicated. The only thing I have found is that 4011
  70. goes straight into a DAC and produces the crowd sounds, but several addresses
  71. in the range 4000-4017 are written to. There are probably three tone generators.
  72.  
  73. 0000-07ff RAM
  74. e000-ffff ROM
  75.  
  76. read:
  77. 4016      IN0
  78. 4017      IN1
  79.  
  80. write:
  81. 4000      ? is usually ORed with 90 or 50
  82. 4001      ? usually 7f, could be associated with 4000
  83. 4002-4003 ? tone #1 freq? (bit 3 of 4003 is always 1, bits 4-7 always 0)
  84. 4004      ? is usually ORed with 90 or 50
  85. 4005      ? usually 7f, could be associated with 4004
  86. 4006-4007 ? tone #2 freq? (bit 3 of 4007 is always 1, bits 4-7 always 0)
  87. 4008      ? at one point the max value is cut at 38
  88. 400a-400b ? tone #3 freq? (bit 3 of 400b is always 1, bits 4-7 always 0)
  89. 400c      ?
  90. 400e-400f ?
  91. 4011      DAC crowd noise
  92. 4015      ?? 00 or 0f
  93. 4017      ?? always c0
  94.  
  95. ***************************************************************************/
  96.  
  97. #include "driver.h"
  98. #include "vidhrdw/generic.h"
  99. #include "cpu/m6502/m6502.h"
  100.  
  101.  
  102. extern unsigned char *punchout_videoram2;
  103. extern size_t punchout_videoram2_size;
  104. extern unsigned char *punchout_bigsprite1ram;
  105. extern size_t punchout_bigsprite1ram_size;
  106. extern unsigned char *punchout_bigsprite2ram;
  107. extern size_t punchout_bigsprite2ram_size;
  108. extern unsigned char *punchout_scroll;
  109. extern unsigned char *punchout_bigsprite1;
  110. extern unsigned char *punchout_bigsprite2;
  111. extern unsigned char *punchout_palettebank;
  112. WRITE_HANDLER( punchout_videoram2_w );
  113. WRITE_HANDLER( punchout_bigsprite1ram_w );
  114. WRITE_HANDLER( punchout_bigsprite2ram_w );
  115. WRITE_HANDLER( punchout_palettebank_w );
  116. int punchout_vh_start(void);
  117. int armwrest_vh_start(void);
  118. void punchout_vh_stop(void);
  119. void punchout_vh_convert_color_prom(unsigned char *palette, unsigned short *colortable,const unsigned char *color_prom);
  120. void armwrest_vh_convert_color_prom(unsigned char *palette, unsigned short *colortable,const unsigned char *color_prom);
  121. void punchout_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh);
  122. void armwrest_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh);
  123.  
  124. void init_punchout(void);
  125. void init_spnchout(void);
  126. void init_spnchotj(void);
  127. void init_armwrest(void);
  128.  
  129.  
  130.  
  131. static unsigned char *nvram;
  132. static size_t nvram_size;
  133.  
  134. static void nvram_handler(void *file,int read_or_write)
  135. {
  136.     if (read_or_write)
  137.         osd_fwrite(file,nvram,nvram_size);
  138.     else
  139.     {
  140.         if (file)
  141.             osd_fread(file,nvram,nvram_size);
  142.         else
  143.             memset(nvram,0,nvram_size);
  144.     }
  145. }
  146.  
  147.  
  148.  
  149. READ_HANDLER( punchout_input_3_r )
  150. {
  151.     int data = input_port_3_r(offset);
  152.     /* bit 4 is busy pin level */
  153.     if( VLM5030_BSY() ) data &= ~0x10;
  154.     else data |= 0x10;
  155.     return data;
  156. }
  157.  
  158. WRITE_HANDLER( punchout_speech_reset_w )
  159. {
  160.     VLM5030_RST( data&0x01 );
  161. }
  162.  
  163. WRITE_HANDLER( punchout_speech_st_w )
  164. {
  165.     VLM5030_ST( data&0x01 );
  166. }
  167.  
  168. WRITE_HANDLER( punchout_speech_vcu_w )
  169. {
  170.     VLM5030_VCU( data & 0x01 );
  171. }
  172.  
  173. WRITE_HANDLER( punchout_2a03_reset_w )
  174. {
  175.     if (data & 1)
  176.         cpu_set_reset_line(1,ASSERT_LINE);
  177.     else
  178.         cpu_set_reset_line(1,CLEAR_LINE);
  179. }
  180.  
  181. static int prot_mode_sel = -1; /* Mode selector */
  182. static int prot_mem[16];
  183.  
  184. static READ_HANDLER( spunchout_prot_r ) {
  185.  
  186.     switch ( offset ) {
  187.         case 0x00:
  188.             if ( prot_mode_sel == 0x0a )
  189.                 return cpu_readmem16(0xd012);
  190.  
  191.             if ( prot_mode_sel == 0x0b || prot_mode_sel == 0x23 )
  192.                 return cpu_readmem16(0xd7c1);
  193.  
  194.             return prot_mem[offset];
  195.         break;
  196.  
  197.         case 0x01:
  198.             if ( prot_mode_sel == 0x08 ) /* PC = 0x0b6a */
  199.                 return 0x00; /* under 6 */
  200.         break;
  201.  
  202.         case 0x02:
  203.             if ( prot_mode_sel == 0x0b ) /* PC = 0x0613 */
  204.                 return 0x09; /* write "JMP (HL)"code to 0d79fh */
  205.             if ( prot_mode_sel == 0x09 ) /* PC = 0x20f9, 0x22d9 */
  206.                 return prot_mem[offset]; /* act as registers */
  207.         break;
  208.  
  209.         case 0x03:
  210.             if ( prot_mode_sel == 0x09 ) /* PC = 0x1e4c */
  211.                 return prot_mem[offset] & 0x07; /* act as registers with mask */
  212.         break;
  213.  
  214.         case 0x05:
  215.             if ( prot_mode_sel == 0x09 ) /* PC = 0x29D1 */
  216.                 return prot_mem[offset] & 0x03; /* AND 0FH -> AND 06H */
  217.         break;
  218.  
  219.         case 0x06:
  220.             if ( prot_mode_sel == 0x0b ) /* PC = 0x2dd8 */
  221.                 return 0x0a; /* E=00, HL=23E6, D = (ret and 0x0f), HL+DE = 2de6 */
  222.  
  223.             if ( prot_mode_sel == 0x09 ) /* PC = 0x2289 */
  224.                 return prot_mem[offset] & 0x07; /* act as registers with mask */
  225.         break;
  226.  
  227.         case 0x09:
  228.             if ( prot_mode_sel == 0x09 ) /* PC = 0x0313 */
  229.                 return ( prot_mem[15] << 4 ); /* pipe through register 0xf7 << 4 */
  230.                 /* (ret or 0x10) -> (D7DF),(D7A0) - (D7DF),(D7A0) = 0d0h(ret nc) */
  231.         break;
  232.  
  233.         case 0x0a:
  234.             if ( prot_mode_sel == 0x0b ) /* PC = 0x060a */
  235.                 return 0x05; /* write "JMP (IX)"code to 0d79eh */
  236.             if ( prot_mode_sel == 0x09 ) /* PC = 0x1bd7 */
  237.                 return prot_mem[offset] & 0x01; /* AND 0FH -> AND 01H */
  238.         break;
  239.  
  240.         case 0x0b:
  241.             if ( prot_mode_sel == 0x09 ) /* PC = 0x2AA3 */
  242.                 return prot_mem[11] & 0x03;    /* AND 0FH -> AND 03H */
  243.         break;
  244.  
  245.         case 0x0c:
  246.             /* PC = 0x2162 */
  247.             /* B = 0(return value) */
  248.             return 0x00;
  249.         case 0x0d:
  250.             return prot_mode_sel;
  251.         break;
  252.     }
  253.  
  254.     logerror("Read from unknown protection? port %02x ( selector = %02x )\n", offset, prot_mode_sel );
  255.  
  256.     return prot_mem[offset];
  257. }
  258.  
  259. static WRITE_HANDLER( spunchout_prot_w ) {
  260.  
  261.     switch ( offset ) {
  262.         case 0x00:
  263.             if ( prot_mode_sel == 0x0a ) {
  264.                 cpu_writemem16(0xd012, data);
  265.                 return;
  266.             }
  267.  
  268.             if ( prot_mode_sel == 0x0b || prot_mode_sel == 0x23 ) {
  269.                 cpu_writemem16(0xd7c1, data);
  270.                 return;
  271.             }
  272.  
  273.             prot_mem[offset] = data;
  274.             return;
  275.         break;
  276.  
  277.         case 0x02:
  278.             if ( prot_mode_sel == 0x09 ) { /* PC = 0x20f7, 0x22d7 */
  279.                 prot_mem[offset] = data;
  280.                 return;
  281.             }
  282.         break;
  283.  
  284.         case 0x03:
  285.             if ( prot_mode_sel == 0x09 ) { /* PC = 0x1e4c */
  286.                 prot_mem[offset] = data;
  287.                 return;
  288.             }
  289.         break;
  290.  
  291.         case 0x05:
  292.             prot_mem[offset] = data;
  293.             return;
  294.  
  295.         case 0x06:
  296.             if ( prot_mode_sel == 0x09 ) { /* PC = 0x2287 */
  297.                 prot_mem[offset] = data;
  298.                 return;
  299.             }
  300.         break;
  301.  
  302.         case 0x0b:
  303.             prot_mem[offset] = data;
  304.             return;
  305.  
  306.         case 0x0d: /* PC = all over the code */
  307.             prot_mode_sel = data;
  308.             return;
  309.         case 0x0f:
  310.             prot_mem[offset] = data;
  311.             return;
  312.     }
  313.  
  314.     logerror("Wrote to unknown protection? port %02x ( %02x )\n", offset, data );
  315.  
  316.     prot_mem[offset] = data;
  317. }
  318.  
  319. static READ_HANDLER( spunchout_prot_0_r ) {
  320.     return spunchout_prot_r( 0 );
  321. }
  322.  
  323. static WRITE_HANDLER( spunchout_prot_0_w ) {
  324.     spunchout_prot_w( 0, data );
  325. }
  326.  
  327. static READ_HANDLER( spunchout_prot_1_r ) {
  328.     return spunchout_prot_r( 1 );
  329. }
  330.  
  331. static WRITE_HANDLER( spunchout_prot_1_w ) {
  332.     spunchout_prot_w( 1, data );
  333. }
  334.  
  335. static READ_HANDLER( spunchout_prot_2_r ) {
  336.     return spunchout_prot_r( 2 );
  337. }
  338.  
  339. static WRITE_HANDLER( spunchout_prot_2_w ) {
  340.     spunchout_prot_w( 2, data );
  341. }
  342.  
  343. static READ_HANDLER( spunchout_prot_3_r ) {
  344.     return spunchout_prot_r( 3 );
  345. }
  346.  
  347. static WRITE_HANDLER( spunchout_prot_3_w ) {
  348.     spunchout_prot_w( 3, data );
  349. }
  350.  
  351. static READ_HANDLER( spunchout_prot_5_r ) {
  352.     return spunchout_prot_r( 5 );
  353. }
  354.  
  355. static WRITE_HANDLER( spunchout_prot_5_w ) {
  356.     spunchout_prot_w( 5, data );
  357. }
  358.  
  359.  
  360. static READ_HANDLER( spunchout_prot_6_r ) {
  361.     return spunchout_prot_r( 6 );
  362. }
  363.  
  364. static WRITE_HANDLER( spunchout_prot_6_w ) {
  365.     spunchout_prot_w( 6, data );
  366. }
  367.  
  368. static READ_HANDLER( spunchout_prot_9_r ) {
  369.     return spunchout_prot_r( 9 );
  370. }
  371.  
  372. static READ_HANDLER( spunchout_prot_b_r ) {
  373.     return spunchout_prot_r( 11 );
  374. }
  375.  
  376. static WRITE_HANDLER( spunchout_prot_b_w ) {
  377.     spunchout_prot_w( 11, data );
  378. }
  379.  
  380. static READ_HANDLER( spunchout_prot_c_r ) {
  381.     return spunchout_prot_r( 12 );
  382. }
  383.  
  384. static WRITE_HANDLER( spunchout_prot_d_w ) {
  385.     spunchout_prot_w( 13, data );
  386. }
  387.  
  388. static READ_HANDLER( spunchout_prot_a_r ) {
  389.     return spunchout_prot_r( 10 );
  390. }
  391.  
  392. static WRITE_HANDLER( spunchout_prot_a_w ) {
  393.     spunchout_prot_w( 10, data );
  394. }
  395.  
  396. #if 0
  397. static READ_HANDLER( spunchout_prot_f_r ) {
  398.     return spunchout_prot_r( 15 );
  399. }
  400. #endif
  401.  
  402. static WRITE_HANDLER( spunchout_prot_f_w ) {
  403.     spunchout_prot_w( 15, data );
  404. }
  405.  
  406.  
  407.  
  408. static struct MemoryReadAddress readmem[] =
  409. {
  410.     { 0x0000, 0xbfff, MRA_ROM },
  411.     { 0xc000, 0xc3ff, MRA_RAM },
  412.     { 0xd000, 0xffff, MRA_RAM },
  413.     { -1 }    /* end of table */
  414. };
  415.  
  416. static struct MemoryWriteAddress writemem[] =
  417. {
  418.     { 0x0000, 0xbfff, MWA_ROM },
  419.     { 0xc000, 0xc3ff, MWA_RAM, &nvram, &nvram_size },
  420.     { 0xd000, 0xd7ff, MWA_RAM },
  421.     { 0xdff0, 0xdff7, MWA_RAM, &punchout_bigsprite1 },
  422.     { 0xdff8, 0xdffc, MWA_RAM, &punchout_bigsprite2 },
  423.     { 0xdffd, 0xdffd, punchout_palettebank_w, &punchout_palettebank },
  424.     { 0xd800, 0xdfff, videoram_w, &videoram, &videoram_size },
  425.     { 0xe000, 0xe7ff, punchout_bigsprite1ram_w, &punchout_bigsprite1ram, &punchout_bigsprite1ram_size },
  426.     { 0xe800, 0xefff, punchout_bigsprite2ram_w, &punchout_bigsprite2ram, &punchout_bigsprite2ram_size },
  427.     { 0xf000, 0xf03f, MWA_RAM, &punchout_scroll },
  428.     { 0xf000, 0xffff, punchout_videoram2_w, &punchout_videoram2, &punchout_videoram2_size },
  429.     { -1 }    /* end of table */
  430. };
  431.  
  432. static struct IOReadPort readport[] =
  433. {
  434.     { 0x00, 0x00, input_port_0_r },
  435.     { 0x01, 0x01, input_port_1_r },
  436.     { 0x02, 0x02, input_port_2_r },
  437.     { 0x03, 0x03, punchout_input_3_r },
  438.  
  439.     /* protection ports */
  440.     { 0x07, 0x07, spunchout_prot_0_r },
  441.     { 0x17, 0x17, spunchout_prot_1_r },
  442.     { 0x27, 0x27, spunchout_prot_2_r },
  443.     { 0x37, 0x37, spunchout_prot_3_r },
  444.     { 0x57, 0x57, spunchout_prot_5_r },
  445.     { 0x67, 0x67, spunchout_prot_6_r },
  446.     { 0x97, 0x97, spunchout_prot_9_r },
  447.     { 0xa7, 0xa7, spunchout_prot_a_r },
  448.     { 0xb7, 0xb7, spunchout_prot_b_r },
  449.     { 0xc7, 0xc7, spunchout_prot_c_r },
  450.     /* { 0xf7, 0xf7, spunchout_prot_f_r }, */
  451.     { -1 }    /* end of table */
  452. };
  453.  
  454. static struct IOWritePort writeport[] =
  455. {
  456.     { 0x00, 0x01, IOWP_NOP },    /* the 2A03 #1 is not present */
  457.     { 0x02, 0x02, soundlatch_w },
  458.     { 0x03, 0x03, soundlatch2_w },
  459.     { 0x04, 0x04, VLM5030_data_w },    /* VLM5030 */
  460.     { 0x05, 0x05, IOWP_NOP },    /* unused */
  461.     { 0x08, 0x08, interrupt_enable_w },
  462.     { 0x09, 0x09, IOWP_NOP },    /* watchdog reset, seldom used because 08 clears the watchdog as well */
  463.     { 0x0a, 0x0a, IOWP_NOP },    /* ?? */
  464.     { 0x0b, 0x0b, punchout_2a03_reset_w },
  465.     { 0x0c, 0x0c, punchout_speech_reset_w },    /* VLM5030 */
  466.     { 0x0d, 0x0d, punchout_speech_st_w    },    /* VLM5030 */
  467.     { 0x0e, 0x0e, punchout_speech_vcu_w   },    /* VLM5030 */
  468.     { 0x0f, 0x0f, IOWP_NOP },    /* enable NVRAM ? */
  469.  
  470.     { 0x06, 0x06, IOWP_NOP},
  471.  
  472.     /* protection ports */
  473.     { 0x07, 0x07, spunchout_prot_0_w },
  474.     { 0x17, 0x17, spunchout_prot_1_w },
  475.     { 0x27, 0x27, spunchout_prot_2_w },
  476.     { 0x37, 0x37, spunchout_prot_3_w },
  477.     { 0x57, 0x57, spunchout_prot_5_w },
  478.     { 0x67, 0x67, spunchout_prot_6_w },
  479.     { 0xa7, 0xa7, spunchout_prot_a_w },
  480.     { 0xb7, 0xb7, spunchout_prot_b_w },
  481.     { 0xd7, 0xd7, spunchout_prot_d_w },
  482.     { 0xf7, 0xf7, spunchout_prot_f_w },
  483.     { -1 }    /* end of table */
  484. };
  485.  
  486. static struct MemoryReadAddress sound_readmem[] =
  487. {
  488.     { 0x0000, 0x07ff, MRA_RAM },
  489.     { 0x4016, 0x4016, soundlatch_r },
  490.     { 0x4017, 0x4017, soundlatch2_r },
  491.     { 0x4000, 0x4017, NESPSG_0_r },
  492.     { 0xe000, 0xffff, MRA_ROM },
  493.     { -1 }    /* end of table */
  494. };
  495.  
  496. static struct MemoryWriteAddress sound_writemem[] =
  497. {
  498.     { 0x0000, 0x07ff, MWA_RAM },
  499.     { 0x4000, 0x4017, NESPSG_0_w },
  500.     { 0xe000, 0xffff, MWA_ROM },
  501.     { -1 }    /* end of table */
  502. };
  503.  
  504.  
  505.  
  506. INPUT_PORTS_START( punchout )
  507.     PORT_START    /* IN0 */
  508.     PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 )
  509.     PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  510.     PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 )
  511.     PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON3 )
  512.     PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  513.     PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  514.     PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  515.     PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  516.  
  517.     PORT_START    /* IN1 */
  518.     PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT | IPF_8WAY )
  519.     PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT  | IPF_8WAY )
  520.     PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP    | IPF_8WAY )
  521.     PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN  | IPF_8WAY )
  522.     PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  523.     PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  524.     PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_COIN2 )
  525.     PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN1 )
  526.  
  527.     PORT_START    /* DSW0 */
  528.     PORT_DIPNAME( 0x03, 0x00, DEF_STR( Difficulty ) )
  529.     PORT_DIPSETTING(    0x00, "Easy" )
  530.     PORT_DIPSETTING(    0x01, "Medium" )
  531.     PORT_DIPSETTING(    0x02, "Hard" )
  532.     PORT_DIPSETTING(    0x03, "Hardest" )
  533.     PORT_DIPNAME( 0x0c, 0x00, "Time" )
  534.     PORT_DIPSETTING(    0x00, "Longest" )
  535.     PORT_DIPSETTING(    0x04, "Long" )
  536.     PORT_DIPSETTING(    0x08, "Short" )
  537.     PORT_DIPSETTING(    0x0c, "Shortest" )
  538.     PORT_DIPNAME( 0x10, 0x10, DEF_STR( Demo_Sounds ) )
  539.     PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
  540.     PORT_DIPSETTING(    0x10, DEF_STR( On ) )
  541.     PORT_DIPNAME( 0x20, 0x00, "Rematch at a Discount" )
  542.     PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
  543.     PORT_DIPSETTING(    0x20, DEF_STR( On ) )
  544.     PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) )
  545.     PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
  546.     PORT_DIPSETTING(    0x40, DEF_STR( On ) )
  547.     PORT_SERVICE( 0x80, IP_ACTIVE_HIGH )
  548.  
  549.     PORT_START    /* DSW1 */
  550.     PORT_DIPNAME( 0x0f, 0x00, DEF_STR( Coinage ) )
  551.     PORT_DIPSETTING(    0x0e, DEF_STR( 5C_1C ) )
  552.     PORT_DIPSETTING(    0x0b, DEF_STR( 4C_1C ) )
  553.     PORT_DIPSETTING(    0x0c, DEF_STR( 3C_1C ) )
  554.     PORT_DIPSETTING(    0x01, DEF_STR( 2C_1C ) )
  555.     PORT_DIPSETTING(    0x00, DEF_STR( 1C_1C ) )
  556. /*    PORT_DIPSETTING(    0x03, DEF_STR( 1C_1C ) )*/
  557. /*    PORT_DIPSETTING(    0x08, "1 Coin/2 Credits (2 min.)" )*/
  558.     PORT_DIPSETTING(    0x0d, "1 Coin/3 Credits (2 min.)" )
  559.     PORT_DIPSETTING(    0x02, DEF_STR( 1C_2C ) )
  560. /*    PORT_DIPSETTING(    0x04, DEF_STR( 1C_2C ) )*/
  561. /*    PORT_DIPSETTING(    0x09, DEF_STR( 1C_2C ) )*/
  562.     PORT_DIPSETTING(    0x05, DEF_STR( 1C_3C ) )
  563.     PORT_DIPSETTING(    0x06, DEF_STR( 1C_4C ) )
  564.     PORT_DIPSETTING(    0x0a, DEF_STR( 1C_5C ) )
  565.     PORT_DIPSETTING(    0x07, DEF_STR( 1C_6C ) )
  566.     PORT_DIPSETTING(    0x0f, DEF_STR( Free_Play ) )
  567.     PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )    /* VLM5030 busy signal */
  568.     PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED )
  569.     PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED )
  570.     PORT_DIPNAME( 0x80, 0x00, "Copyright" )
  571.     PORT_DIPSETTING(    0x00, "Nintendo" )
  572.     PORT_DIPSETTING(    0x80, "Nintendo of America" )
  573.     PORT_START
  574. INPUT_PORTS_END
  575.  
  576. /* same as punchout with additional duck button */
  577. INPUT_PORTS_START( spnchout )
  578.     PORT_START    /* IN0 */
  579.     PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 )
  580.     PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  581.     PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 )
  582.     PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON3 )
  583.     PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  584.     PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  585.     PORT_BIT( 0x40, IP_ACTIVE_LOW,  IPT_BUTTON4 )
  586.     PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  587.  
  588.     PORT_START    /* IN1 */
  589.     PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT | IPF_8WAY )
  590.     PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT  | IPF_8WAY )
  591.     PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP    | IPF_8WAY )
  592.     PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN  | IPF_8WAY )
  593.     PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  594.     PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  595.     PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_COIN2 )
  596.     PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN1 )
  597.  
  598.     PORT_START    /* DSW0 */
  599.     PORT_DIPNAME( 0x03, 0x00, DEF_STR( Difficulty ) )
  600.     PORT_DIPSETTING(    0x00, "Easy" )
  601.     PORT_DIPSETTING(    0x01, "Medium" )
  602.     PORT_DIPSETTING(    0x02, "Hard" )
  603.     PORT_DIPSETTING(    0x03, "Hardest" )
  604.     PORT_DIPNAME( 0x0c, 0x00, "Time" )
  605.     PORT_DIPSETTING(    0x00, "Longest" )
  606.     PORT_DIPSETTING(    0x04, "Long" )
  607.     PORT_DIPSETTING(    0x08, "Short" )
  608.     PORT_DIPSETTING(    0x0c, "Shortest" )
  609.     PORT_DIPNAME( 0x10, 0x10, DEF_STR( Demo_Sounds ) )
  610.     PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
  611.     PORT_DIPSETTING(    0x10, DEF_STR( On ) )
  612.     PORT_DIPNAME( 0x20, 0x00, "Rematch at a Discount" )
  613.     PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
  614.     PORT_DIPSETTING(    0x20, DEF_STR( On ) )
  615.     PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) )
  616.     PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
  617.     PORT_DIPSETTING(    0x40, DEF_STR( On ) )
  618.     PORT_SERVICE( 0x80, IP_ACTIVE_HIGH )
  619.  
  620.     PORT_START    /* DSW1 */
  621.     PORT_DIPNAME( 0x0f, 0x00, DEF_STR( Coinage ) )
  622.     PORT_DIPSETTING(    0x0e, DEF_STR( 5C_1C ) )
  623.     PORT_DIPSETTING(    0x0b, DEF_STR( 4C_1C ) )
  624.     PORT_DIPSETTING(    0x0c, DEF_STR( 3C_1C ) )
  625.     PORT_DIPSETTING(    0x01, DEF_STR( 2C_1C ) )
  626.     PORT_DIPSETTING(    0x00, DEF_STR( 1C_1C ) )
  627. /*    PORT_DIPSETTING(    0x03, DEF_STR( 1C_1C ) )*/
  628. /*    PORT_DIPSETTING(    0x08, "1 Coin/2 Credits (2 min.)" )*/
  629.     PORT_DIPSETTING(    0x0d, "1 Coin/3 Credits (2 min.)" )
  630.     PORT_DIPSETTING(    0x02, DEF_STR( 1C_2C ) )
  631. /*    PORT_DIPSETTING(    0x04, DEF_STR( 1C_2C ) )*/
  632. /*    PORT_DIPSETTING(    0x09, DEF_STR( 1C_2C ) )*/
  633.     PORT_DIPSETTING(    0x05, DEF_STR( 1C_3C ) )
  634.     PORT_DIPSETTING(    0x06, DEF_STR( 1C_4C ) )
  635.     PORT_DIPSETTING(    0x0a, DEF_STR( 1C_5C ) )
  636.     PORT_DIPSETTING(    0x07, DEF_STR( 1C_6C ) )
  637.     PORT_DIPSETTING(    0x0f, DEF_STR( Free_Play ) )
  638.     PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )    /* VLM5030 busy signal */
  639.     PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED )
  640.     PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED )
  641.     PORT_DIPNAME( 0x80, 0x00, "Copyright" )
  642.     PORT_DIPSETTING(    0x00, "Nintendo" )
  643.     PORT_DIPSETTING(    0x80, "Nintendo of America" )
  644.     PORT_START
  645. INPUT_PORTS_END
  646.  
  647. INPUT_PORTS_START( armwrest )
  648.     PORT_START    /* IN0 */
  649.     PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  650.     PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  651.     PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  652.     PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  653.     PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  654.     PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON1 )
  655.     PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY )
  656.     PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  657.  
  658.     PORT_START    /* IN1 */
  659.     PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT | IPF_8WAY )
  660.     PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT | IPF_8WAY )
  661.     PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  662.     PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  663.     PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  664.     PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_COIN2 )
  665.     PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_COIN3 )
  666.     PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN1 )
  667.  
  668.     PORT_START    /* DSW0 */
  669.     PORT_DIPNAME( 0x03, 0x00, DEF_STR( Difficulty ) )
  670.     PORT_DIPSETTING(    0x00, "Easy" )
  671.     PORT_DIPSETTING(    0x01, "Medium" )
  672.     PORT_DIPSETTING(    0x02, "Hard" )
  673.     PORT_DIPSETTING(    0x03, "Hardest" )
  674.     PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unknown ) )
  675.     PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
  676.     PORT_DIPSETTING(    0x04, DEF_STR( On ) )
  677.     PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown ) )
  678.     PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
  679.     PORT_DIPSETTING(    0x08, DEF_STR( On ) )
  680.     PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) )
  681.     PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
  682.     PORT_DIPSETTING(    0x10, DEF_STR( On ) )
  683.     PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unknown ) )
  684.     PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
  685.     PORT_DIPSETTING(    0x20, DEF_STR( On ) )
  686.     PORT_DIPNAME( 0x40, 0x00, "Rematches" )
  687.     PORT_DIPSETTING(    0x40, "3" )
  688.     PORT_DIPSETTING(    0x00, "7" )
  689.     PORT_SERVICE( 0x80, IP_ACTIVE_HIGH )
  690.  
  691.     PORT_START    /* DSW1 */
  692.     PORT_DIPNAME( 0x01, 0x00, DEF_STR( Unknown ) )
  693.     PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
  694.     PORT_DIPSETTING(    0x01, DEF_STR( On ) )
  695.     PORT_DIPNAME( 0x02, 0x00, DEF_STR( Unknown ) )
  696.     PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
  697.     PORT_DIPSETTING(    0x02, DEF_STR( On ) )
  698.     PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unknown ) )
  699.     PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
  700.     PORT_DIPSETTING(    0x04, DEF_STR( On ) )
  701.     PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown ) )
  702.     PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
  703.     PORT_DIPSETTING(    0x08, DEF_STR( On ) )
  704.     PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )    /* VLM5030 busy signal */
  705.     PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED )
  706.     PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED )
  707.     PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED )
  708. INPUT_PORTS_END
  709.  
  710.  
  711. static struct GfxLayout charlayout =
  712. {
  713.     8,8,    /* 8*8 characters */
  714.     1024,    /* 1024 characters */
  715.     2,    /* 2 bits per pixel */
  716.     { 1024*8*8, 0 },    /* the bitplanes are separated */
  717.     { 0, 1, 2, 3, 4, 5, 6, 7 },
  718.     { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
  719.     8*8    /* every char takes 8 consecutive bytes */
  720. };
  721.  
  722. static struct GfxLayout armwrest_charlayout =
  723. {
  724.     8,8,    /* 8*8 characters */
  725.     2048,    /* 2048 characters */
  726.     2,    /* 2 bits per pixel */
  727.     { 2048*8*8, 0 },    /* the bitplanes are separated */
  728.     { 0, 1, 2, 3, 4, 5, 6, 7 },
  729.     { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
  730.     8*8    /* every char takes 8 consecutive bytes */
  731. };
  732.  
  733. static struct GfxLayout armwrest_charlayout2 =
  734. {
  735.     8,8,    /* 8*8 characters */
  736.     2048,    /* 2048 characters */
  737.     3,    /* 3 bits per pixel */
  738.     { 2*2048*8*8, 2048*8*8, 0 },    /* the bitplanes are separated */
  739.     { 0, 1, 2, 3, 4, 5, 6, 7 },
  740.     { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
  741.     8*8    /* every char takes 8 consecutive bytes */
  742. };
  743.  
  744. static struct GfxLayout charlayout1 =
  745. {
  746.     8,8,    /* 8*8 characters */
  747.     8192,    /* 8192 characters */
  748.     3,    /* 3 bits per pixel */
  749.     { 2*8192*8*8, 8192*8*8, 0 },    /* the bitplanes are separated */
  750.     { 0, 1, 2, 3, 4, 5, 6, 7 },
  751.     { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
  752.     8*8    /* every char takes 8 consecutive bytes */
  753. };
  754.  
  755. static struct GfxLayout charlayout2 =
  756. {
  757.     8,8,    /* 8*8 characters */
  758.     4096,    /* 4096 characters */
  759.     2,    /* 2 bits per pixel */
  760.     { 4096*8*8, 0 },    /* the bitplanes are separated */
  761.     { 0, 1, 2, 3, 4, 5, 6, 7 },
  762.     { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
  763.     8*8    /* every char takes 8 consecutive bytes */
  764. };
  765.  
  766. static struct GfxDecodeInfo punchout_gfxdecodeinfo[] =
  767. {
  768.     { REGION_GFX1, 0, &charlayout,                 0, 128 },
  769.     { REGION_GFX2, 0, &charlayout,             128*4, 128 },
  770.     { REGION_GFX3, 0, &charlayout1,      128*4+128*4,  64 },
  771.     { REGION_GFX4, 0, &charlayout2, 128*4+128*4+64*8, 128 },
  772.     { -1 } /* end of array */
  773. };
  774.  
  775. static struct GfxDecodeInfo armwrest_gfxdecodeinfo[] =
  776. {
  777.     { REGION_GFX1, 0, &armwrest_charlayout,        0, 256 },
  778.     { REGION_GFX2, 0, &armwrest_charlayout2,   256*4,  64 },
  779.     { REGION_GFX3, 0, &charlayout1,       256*4+64*8,  64 },
  780.     { REGION_GFX4, 0, &charlayout2,  256*4+64*8+64*8, 128 },
  781.     { -1 } /* end of array */
  782. };
  783.  
  784.  
  785.  
  786. static struct NESinterface nes_interface =
  787. {
  788.     1,
  789.     { REGION_CPU2 },
  790.     { 50 },
  791. };
  792.  
  793. /* filename for speech sample files */
  794. static const char *punchout_sample_names[] =
  795. {
  796.     "*punchout",
  797.     "00.wav","01.wav","02.wav","03.wav","04.wav","05.wav","06.wav","07.wav",
  798.     "08.wav","09.wav","0a.wav","0b.wav","0c.wav","0d.wav","0e.wav","0f.wav",
  799.     "10.wav","11.wav","12.wav","13.wav","14.wav","15.wav","16.wav","17.wav",
  800.     "18.wav","19.wav","1a.wav","1b.wav","1c.wav","1d.wav","1e.wav","1f.wav",
  801.     "20.wav","21.wav","22.wav","23.wav","24.wav","25.wav","26.wav","27.wav",
  802.     "28.wav","29.wav","2a.wav","2b.wav",
  803.     0
  804. };
  805.  
  806. static struct VLM5030interface vlm5030_interface =
  807. {
  808.     3580000,    /* master clock */
  809.     50,        /* volume       */
  810.     REGION_SOUND1,    /* memory region of speech rom */
  811.     0,          /* memory size of speech rom */
  812.     0,           /* VCU pin level (default)     */
  813.     punchout_sample_names
  814. };
  815.  
  816.  
  817.  
  818. #define MACHINE_DRIVER(NAME,GFX,COLORTABLE)                                            \
  819. static struct MachineDriver machine_driver_##NAME =                                    \
  820. {                                                                                    \
  821.     /* basic machine hardware */                                                    \
  822.     {                                                                                \
  823.         {                                                                            \
  824.             CPU_Z80,                                                                \
  825.             8000000/2,    /* 4 Mhz */                                                    \
  826.             readmem,writemem,readport,writeport,                                    \
  827.             nmi_interrupt,1                                                            \
  828.         },                                                                            \
  829.         {                                                                            \
  830.             CPU_N2A03 | CPU_AUDIO_CPU,                                                \
  831.             N2A03_DEFAULTCLOCK,                                                        \
  832.             sound_readmem,sound_writemem,0,0,                                        \
  833.             nmi_interrupt,1                                                            \
  834.         }                                                                            \
  835.     },                                                                                \
  836.     60, DEFAULT_60HZ_VBLANK_DURATION,    /* frames per second, vblank duration */    \
  837.     1,    /* 1 CPU slice per frame - interleaving is forced when a sound command is written */    \
  838.     0,                                                                                \
  839.                                                                                     \
  840.     /* video hardware */                                                            \
  841.     32*8, 60*8, { 0*8, 32*8-1, 0*8, 60*8-1 },                                        \
  842.     GFX##_gfxdecodeinfo,                                                            \
  843.     1024+1, COLORTABLE,                                                                \
  844.     GFX##_vh_convert_color_prom,                                                    \
  845.                                                                                     \
  846.     VIDEO_TYPE_RASTER | VIDEO_DUAL_MONITOR,                                            \
  847.     0,                                                                                \
  848.     GFX##_vh_start,                                                                    \
  849.     punchout_vh_stop,                                                                \
  850.     GFX##_vh_screenrefresh,                                                            \
  851.                                                                                     \
  852.     /* sound hardware */                                                            \
  853.     0,0,0,0,                                                                        \
  854.     {                                                                                \
  855.         {                                                                            \
  856.             SOUND_NES,                                                                \
  857.             &nes_interface                                                            \
  858.         },                                                                            \
  859.         {                                                                            \
  860.             SOUND_VLM5030,                                                            \
  861.             &vlm5030_interface                                                        \
  862.         }                                                                            \
  863.     },                                                                                \
  864.                                                                                     \
  865.     nvram_handler                                                                    \
  866. };
  867.  
  868.  
  869. MACHINE_DRIVER( punchout, punchout, 128*4+128*4+64*8+128*4 )
  870. MACHINE_DRIVER( armwrest, armwrest, 256*4+64*8+64*8+128*4 )
  871.  
  872.  
  873.  
  874. /***************************************************************************
  875.  
  876.   Game driver(s)
  877.  
  878. ***************************************************************************/
  879.  
  880. ROM_START( punchout )
  881.     ROM_REGION( 0x10000, REGION_CPU1 )    /* 64k for code */
  882.     ROM_LOAD( "chp1-c.8l",    0x0000, 0x2000, 0xa4003adc )
  883.     ROM_LOAD( "chp1-c.8k",    0x2000, 0x2000, 0x745ecf40 )
  884.     ROM_LOAD( "chp1-c.8j",    0x4000, 0x2000, 0x7a7f870e )
  885.     ROM_LOAD( "chp1-c.8h",    0x6000, 0x2000, 0x5d8123d7 )
  886.     ROM_LOAD( "chp1-c.8f",    0x8000, 0x4000, 0xc8a55ddb )
  887.  
  888.     ROM_REGION( 0x10000, REGION_CPU2 )    /* 64k for the sound CPU */
  889.     ROM_LOAD( "chp1-c.4k",    0xe000, 0x2000, 0xcb6ef376 )
  890.  
  891.     ROM_REGION( 0x04000, REGION_GFX1 | REGIONFLAG_DISPOSE )
  892.     ROM_LOAD( "chp1-b.4c",    0x00000, 0x2000, 0xe26dc8b3 )    /* chars #1 */
  893.     ROM_LOAD( "chp1-b.4d",    0x02000, 0x2000, 0xdd1310ca )
  894.  
  895.     ROM_REGION( 0x04000, REGION_GFX2 | REGIONFLAG_DISPOSE )
  896.     ROM_LOAD( "chp1-b.4a",    0x00000, 0x2000, 0x20fb4829 )    /* chars #2 */
  897.     ROM_LOAD( "chp1-b.4b",    0x02000, 0x2000, 0xedc34594 )
  898.  
  899.     ROM_REGION( 0x30000, REGION_GFX3 | REGIONFLAG_DISPOSE )
  900.     ROM_LOAD( "chp1-v.2r",    0x00000, 0x4000, 0xbd1d4b2e )    /* chars #3 */
  901.     ROM_LOAD( "chp1-v.2t",    0x04000, 0x4000, 0xdd9a688a )
  902.     ROM_LOAD( "chp1-v.2u",    0x08000, 0x2000, 0xda6a3c4b )
  903.     /* 0a000-0bfff empty (space for 16k ROM) */
  904.     ROM_LOAD( "chp1-v.2v",    0x0c000, 0x2000, 0x8c734a67 )
  905.     /* 0e000-0ffff empty (space for 16k ROM) */
  906.     ROM_LOAD( "chp1-v.3r",    0x10000, 0x4000, 0x2e74ad1d )
  907.     ROM_LOAD( "chp1-v.3t",    0x14000, 0x4000, 0x630ba9fb )
  908.     ROM_LOAD( "chp1-v.3u",    0x18000, 0x2000, 0x6440321d )
  909.     /* 1a000-1bfff empty (space for 16k ROM) */
  910.     ROM_LOAD( "chp1-v.3v",    0x1c000, 0x2000, 0xbb7b7198 )
  911.     /* 1e000-1ffff empty (space for 16k ROM) */
  912.     ROM_LOAD( "chp1-v.4r",    0x20000, 0x4000, 0x4e5b0fe9 )
  913.     ROM_LOAD( "chp1-v.4t",    0x24000, 0x4000, 0x37ffc940 )
  914.     ROM_LOAD( "chp1-v.4u",    0x28000, 0x2000, 0x1a7521d4 )
  915.     /* 2a000-2bfff empty (space for 16k ROM) */
  916.     /* 2c000-2ffff empty (4v doesn't exist, it is seen as a 0xff fill) */
  917.  
  918.     ROM_REGION( 0x10000, REGION_GFX4 | REGIONFLAG_DISPOSE )
  919.     ROM_LOAD( "chp1-v.6p",    0x00000, 0x2000, 0x16588f7a )    /* chars #4 */
  920.     ROM_LOAD( "chp1-v.6n",    0x02000, 0x2000, 0xdc743674 )
  921.     /* 04000-07fff empty (space for 6l and 6k) */
  922.     ROM_LOAD( "chp1-v.8p",    0x08000, 0x2000, 0xc2db5b4e )
  923.     ROM_LOAD( "chp1-v.8n",    0x0a000, 0x2000, 0xe6af390e )
  924.     /* 0c000-0ffff empty (space for 8l and 8k) */
  925.  
  926.     ROM_REGION( 0x0d00, REGION_PROMS )
  927.     ROM_LOAD( "chp1-b.6e",    0x0000, 0x0200, 0xe9ca3ac6 )    /* red component */
  928.     ROM_LOAD( "chp1-b.7e",    0x0200, 0x0200, 0x47adf7a2 )    /* red component */
  929.     ROM_LOAD( "chp1-b.6f",    0x0400, 0x0200, 0x02be56ab )    /* green component */
  930.     ROM_LOAD( "chp1-b.8e",    0x0600, 0x0200, 0xb0fc15a8 )    /* green component */
  931.     ROM_LOAD( "chp1-b.7f",    0x0800, 0x0200, 0x11de55f1 )    /* blue component */
  932.     ROM_LOAD( "chp1-b.8f",    0x0a00, 0x0200, 0x1ffd894a )    /* blue component */
  933.     ROM_LOAD( "chp1-v.2d",    0x0c00, 0x0100, 0x71dc0d48 )    /* timing - not used */
  934.  
  935.     ROM_REGION( 0x4000, REGION_SOUND1 )    /* 16k for the VLM5030 data */
  936.     ROM_LOAD( "chp1-c.6p",    0x0000, 0x4000, 0xea0bbb31 )
  937. ROM_END
  938.  
  939. ROM_START( spnchout )
  940.     ROM_REGION( 0x10000, REGION_CPU1 )    /* 64k for code */
  941.     ROM_LOAD( "chs1-c.8l",    0x0000, 0x2000, 0x703b9780 )
  942.     ROM_LOAD( "chs1-c.8k",    0x2000, 0x2000, 0xe13719f6 )
  943.     ROM_LOAD( "chs1-c.8j",    0x4000, 0x2000, 0x1fa629e8 )
  944.     ROM_LOAD( "chs1-c.8h",    0x6000, 0x2000, 0x15a6c068 )
  945.     ROM_LOAD( "chs1-c.8f",    0x8000, 0x4000, 0x4ff3cdd9 )
  946.  
  947.     ROM_REGION( 0x10000, REGION_CPU2 )    /* 64k for the sound CPU */
  948.     ROM_LOAD( "chp1-c.4k",    0xe000, 0x2000, 0xcb6ef376 )
  949.  
  950.     ROM_REGION( 0x04000, REGION_GFX1 | REGIONFLAG_DISPOSE )
  951.     ROM_LOAD( "chs1-b.4c",    0x00000, 0x0800, 0x9f2ede2d )    /* chars #1 */
  952.     ROM_CONTINUE(             0x01000, 0x0800 )
  953.     ROM_CONTINUE(             0x00800, 0x0800 )
  954.     ROM_CONTINUE(             0x01800, 0x0800 )
  955.     ROM_LOAD( "chs1-b.4d",    0x02000, 0x0800, 0x143ae5c6 )
  956.     ROM_CONTINUE(             0x03000, 0x0800 )
  957.     ROM_CONTINUE(             0x02800, 0x0800 )
  958.     ROM_CONTINUE(             0x03800, 0x0800 )
  959.  
  960.     ROM_REGION( 0x04000, REGION_GFX2 | REGIONFLAG_DISPOSE )
  961.     ROM_LOAD( "chp1-b.4a",    0x00000, 0x0800, 0xc075f831 )    /* chars #2 */
  962.     ROM_CONTINUE(             0x01000, 0x0800 )
  963.     ROM_CONTINUE(             0x00800, 0x0800 )
  964.     ROM_CONTINUE(             0x01800, 0x0800 )
  965.     ROM_LOAD( "chp1-b.4b",    0x02000, 0x0800, 0xc4cc2b5a )
  966.     ROM_CONTINUE(             0x03000, 0x0800 )
  967.     ROM_CONTINUE(             0x02800, 0x0800 )
  968.     ROM_CONTINUE(             0x03800, 0x0800 )
  969.  
  970.     ROM_REGION( 0x30000, REGION_GFX3 | REGIONFLAG_DISPOSE )
  971.     ROM_LOAD( "chs1-v.2r",    0x00000, 0x4000, 0xff33405d )    /* chars #3 */
  972.     ROM_LOAD( "chs1-v.2t",    0x04000, 0x4000, 0xf507818b )
  973.     ROM_LOAD( "chs1-v.2u",    0x08000, 0x4000, 0x0995fc95 )
  974.     ROM_LOAD( "chs1-v.2v",    0x0c000, 0x2000, 0xf44d9878 )
  975.     /* 0e000-0ffff empty (space for 16k ROM) */
  976.     ROM_LOAD( "chs1-v.3r",    0x10000, 0x4000, 0x09570945 )
  977.     ROM_LOAD( "chs1-v.3t",    0x14000, 0x4000, 0x42c6861c )
  978.     ROM_LOAD( "chs1-v.3u",    0x18000, 0x4000, 0xbf5d02dd )
  979.     ROM_LOAD( "chs1-v.3v",    0x1c000, 0x2000, 0x5673f4fc )
  980.     /* 1e000-1ffff empty (space for 16k ROM) */
  981.     ROM_LOAD( "chs1-v.4r",    0x20000, 0x4000, 0x8e155758 )
  982.     ROM_LOAD( "chs1-v.4t",    0x24000, 0x4000, 0xb4e43448 )
  983.     ROM_LOAD( "chs1-v.4u",    0x28000, 0x4000, 0x74e0d956 )
  984.     /* 2c000-2ffff empty (4v doesn't exist, it is seen as a 0xff fill) */
  985.  
  986.     ROM_REGION( 0x10000, REGION_GFX4 | REGIONFLAG_DISPOSE )
  987.     ROM_LOAD( "chp1-v.6p",    0x00000, 0x0800, 0x75be7aae )    /* chars #4 */
  988.     ROM_CONTINUE(             0x01000, 0x0800 )
  989.     ROM_CONTINUE(             0x00800, 0x0800 )
  990.     ROM_CONTINUE(             0x01800, 0x0800 )
  991.     ROM_LOAD( "chp1-v.6n",    0x02000, 0x0800, 0xdaf74de0 )
  992.     ROM_CONTINUE(             0x03000, 0x0800 )
  993.     ROM_CONTINUE(             0x02800, 0x0800 )
  994.     ROM_CONTINUE(             0x03800, 0x0800 )
  995.     /* 04000-07fff empty (space for 6l and 6k) */
  996.     ROM_LOAD( "chp1-v.8p",    0x08000, 0x0800, 0x4cb7ea82 )
  997.     ROM_CONTINUE(             0x09000, 0x0800 )
  998.     ROM_CONTINUE(             0x08800, 0x0800 )
  999.     ROM_CONTINUE(             0x09800, 0x0800 )
  1000.     ROM_LOAD( "chp1-v.8n",    0x0a000, 0x0800, 0x1c0d09aa )
  1001.     ROM_CONTINUE(             0x0b000, 0x0800 )
  1002.     ROM_CONTINUE(             0x0a800, 0x0800 )
  1003.     ROM_CONTINUE(             0x0b800, 0x0800 )
  1004.     /* 0c000-0ffff empty (space for 8l and 8k) */
  1005.  
  1006.     ROM_REGION( 0x0d00, REGION_PROMS )
  1007.     ROM_LOAD( "chs1-b.6e",    0x0000, 0x0200, 0x0ad4d727 )    /* red component */
  1008.     ROM_LOAD( "chs1-b.7e",    0x0200, 0x0200, 0x9e170f64 )    /* red component */
  1009.     ROM_LOAD( "chs1-b.6f",    0x0400, 0x0200, 0x86f5cfdb )    /* green component */
  1010.     ROM_LOAD( "chs1-b.8e",    0x0600, 0x0200, 0x3a2e333b )    /* green component */
  1011.     ROM_LOAD( "chs1-b.7f",    0x0800, 0x0200, 0x8bd406f8 )    /* blue component */
  1012.     ROM_LOAD( "chs1-b.8f",    0x0a00, 0x0200, 0x1663eed7 )    /* blue component */
  1013.     ROM_LOAD( "chs1-v.2d",    0x0c00, 0x0100, 0x71dc0d48 )    /* timing - not used */
  1014.  
  1015.     ROM_REGION( 0x10000, REGION_SOUND1 )    /* 64k for the VLM5030 data */
  1016.     ROM_LOAD( "chs1-c.6p",    0x0000, 0x4000, 0xad8b64b8 )
  1017. ROM_END
  1018.  
  1019. ROM_START( spnchotj )
  1020.     ROM_REGION( 0x10000, REGION_CPU1 )    /* 64k for code */
  1021.     ROM_LOAD( "chs1c8la.bin", 0x0000, 0x2000, 0xdc2a592b )
  1022.     ROM_LOAD( "chs1c8ka.bin", 0x2000, 0x2000, 0xce687182 )
  1023.     ROM_LOAD( "chs1-c.8j",    0x4000, 0x2000, 0x1fa629e8 )
  1024.     ROM_LOAD( "chs1-c.8h",    0x6000, 0x2000, 0x15a6c068 )
  1025.     ROM_LOAD( "chs1c8fa.bin", 0x8000, 0x4000, 0xf745b5d5 )
  1026.  
  1027.     ROM_REGION( 0x10000, REGION_CPU2 )    /* 64k for the sound CPU */
  1028.     ROM_LOAD( "chp1-c.4k",    0xe000, 0x2000, 0xcb6ef376 )
  1029.  
  1030.     ROM_REGION( 0x04000, REGION_GFX1 | REGIONFLAG_DISPOSE )
  1031.     ROM_LOAD( "b_4c_01a.bin", 0x00000, 0x2000, 0xb017e1e9 )    /* chars #1 */
  1032.     ROM_LOAD( "b_4d_01a.bin", 0x02000, 0x2000, 0xe3de9d18 )
  1033.  
  1034.     ROM_REGION( 0x04000, REGION_GFX2 | REGIONFLAG_DISPOSE )
  1035.     ROM_LOAD( "chp1-b.4a",    0x00000, 0x0800, 0xc075f831 )    /* chars #2 */
  1036.     ROM_CONTINUE(             0x01000, 0x0800 )
  1037.     ROM_CONTINUE(             0x00800, 0x0800 )
  1038.     ROM_CONTINUE(             0x01800, 0x0800 )
  1039.     ROM_LOAD( "chp1-b.4b",    0x02000, 0x0800, 0xc4cc2b5a )
  1040.     ROM_CONTINUE(             0x03000, 0x0800 )
  1041.     ROM_CONTINUE(             0x02800, 0x0800 )
  1042.     ROM_CONTINUE(             0x03800, 0x0800 )
  1043.  
  1044.     ROM_REGION( 0x30000, REGION_GFX3 | REGIONFLAG_DISPOSE )
  1045.     ROM_LOAD( "chs1-v.2r",    0x00000, 0x4000, 0xff33405d )    /* chars #3 */
  1046.     ROM_LOAD( "chs1-v.2t",    0x04000, 0x4000, 0xf507818b )
  1047.     ROM_LOAD( "chs1-v.2u",    0x08000, 0x4000, 0x0995fc95 )
  1048.     ROM_LOAD( "chs1-v.2v",    0x0c000, 0x2000, 0xf44d9878 )
  1049.     /* 0e000-0ffff empty (space for 16k ROM) */
  1050.     ROM_LOAD( "chs1-v.3r",    0x10000, 0x4000, 0x09570945 )
  1051.     ROM_LOAD( "chs1-v.3t",    0x14000, 0x4000, 0x42c6861c )
  1052.     ROM_LOAD( "chs1-v.3u",    0x18000, 0x4000, 0xbf5d02dd )
  1053.     ROM_LOAD( "chs1-v.3v",    0x1c000, 0x2000, 0x5673f4fc )
  1054.     /* 1e000-1ffff empty (space for 16k ROM) */
  1055.     ROM_LOAD( "chs1-v.4r",    0x20000, 0x4000, 0x8e155758 )
  1056.     ROM_LOAD( "chs1-v.4t",    0x24000, 0x4000, 0xb4e43448 )
  1057.     ROM_LOAD( "chs1-v.4u",    0x28000, 0x4000, 0x74e0d956 )
  1058.     /* 2c000-2ffff empty (4v doesn't exist, it is seen as a 0xff fill) */
  1059.  
  1060.     ROM_REGION( 0x10000, REGION_GFX4 | REGIONFLAG_DISPOSE )
  1061.     ROM_LOAD( "chp1-v.6p",    0x00000, 0x0800, 0x75be7aae )    /* chars #4 */
  1062.     ROM_CONTINUE(             0x01000, 0x0800 )
  1063.     ROM_CONTINUE(             0x00800, 0x0800 )
  1064.     ROM_CONTINUE(             0x01800, 0x0800 )
  1065.     ROM_LOAD( "chp1-v.6n",    0x02000, 0x0800, 0xdaf74de0 )
  1066.     ROM_CONTINUE(             0x03000, 0x0800 )
  1067.     ROM_CONTINUE(             0x02800, 0x0800 )
  1068.     ROM_CONTINUE(             0x03800, 0x0800 )
  1069.     /* 04000-07fff empty (space for 6l and 6k) */
  1070.     ROM_LOAD( "chp1-v.8p",    0x08000, 0x0800, 0x4cb7ea82 )
  1071.     ROM_CONTINUE(             0x09000, 0x0800 )
  1072.     ROM_CONTINUE(             0x08800, 0x0800 )
  1073.     ROM_CONTINUE(             0x09800, 0x0800 )
  1074.     ROM_LOAD( "chp1-v.8n",    0x0a000, 0x0800, 0x1c0d09aa )
  1075.     ROM_CONTINUE(             0x0b000, 0x0800 )
  1076.     ROM_CONTINUE(             0x0a800, 0x0800 )
  1077.     ROM_CONTINUE(             0x0b800, 0x0800 )
  1078.     /* 0c000-0ffff empty (space for 8l and 8k) */
  1079.  
  1080.     ROM_REGION( 0x0d00, REGION_PROMS )
  1081.     ROM_LOAD( "chs1b_6e.bpr", 0x0000, 0x0200, 0x8efd867f )    /* red component */
  1082.     ROM_LOAD( "chs1-b.7e",    0x0200, 0x0200, 0x9e170f64 )    /* red component */
  1083.     ROM_LOAD( "chs1b_6f.bpr", 0x0400, 0x0200, 0x279d6cbc )    /* green component */
  1084.     ROM_LOAD( "chs1-b.8e",    0x0600, 0x0200, 0x3a2e333b )    /* green component */
  1085.     ROM_LOAD( "chs1b_7f.bpr", 0x0800, 0x0200, 0xcad6b7ad )    /* blue component */
  1086.     ROM_LOAD( "chs1-b.8f",    0x0a00, 0x0200, 0x1663eed7 )    /* blue component */
  1087.     ROM_LOAD( "chs1-v.2d",    0x0c00, 0x0100, 0x71dc0d48 )    /* timing - not used */
  1088.  
  1089.     ROM_REGION( 0x10000, REGION_SOUND1 )    /* 64k for the VLM5030 data */
  1090.     ROM_LOAD( "chs1c6pa.bin", 0x0000, 0x4000, 0xd05fb730 )
  1091. ROM_END
  1092.  
  1093. ROM_START( armwrest )
  1094.     ROM_REGION( 0x10000, REGION_CPU1 )    /* 64k for code */
  1095.     ROM_LOAD( "chv1-c.8l",    0x0000, 0x2000, 0xb09764c1 )
  1096.     ROM_LOAD( "chv1-c.8k",    0x2000, 0x2000, 0x0e147ff7 )
  1097.     ROM_LOAD( "chv1-c.8j",    0x4000, 0x2000, 0xe7365289 )
  1098.     ROM_LOAD( "chv1-c.8h",    0x6000, 0x2000, 0xa2118eec )
  1099.     ROM_LOAD( "chpv-c.8f",    0x8000, 0x4000, 0x664a07c4 )
  1100.  
  1101.     ROM_REGION( 0x10000, REGION_CPU2 )    /* 64k for the sound CPU */
  1102.     ROM_LOAD( "chp1-c.4k",    0xe000, 0x2000, 0xcb6ef376 )    /* same as Punch Out */
  1103.  
  1104.     ROM_REGION( 0x08000, REGION_GFX1 | REGIONFLAG_DISPOSE )
  1105.     ROM_LOAD( "chpv-b.2e",    0x00000, 0x4000, 0x8b45f365 )    /* chars #1 */
  1106.     ROM_LOAD( "chpv-b.2d",    0x04000, 0x4000, 0xb1a2850c )
  1107.  
  1108.     ROM_REGION( 0x0c000, REGION_GFX2 | REGIONFLAG_DISPOSE )
  1109.     ROM_LOAD( "chpv-b.2m",    0x00000, 0x4000, 0x19245b37 )    /* chars #2 */
  1110.     ROM_LOAD( "chpv-b.2l",    0x04000, 0x4000, 0x46797941 )
  1111.     ROM_LOAD( "chpv-b.2k",    0x08000, 0x4000, 0x24c4c26d )
  1112.  
  1113.     ROM_REGION( 0x30000, REGION_GFX3 | REGIONFLAG_DISPOSE )
  1114.     ROM_LOAD( "chv1-v.2r",    0x00000, 0x4000, 0xd86056d9 )    /* chars #3 */
  1115.     ROM_LOAD( "chv1-v.2t",    0x04000, 0x4000, 0x5ad77059 )
  1116.     /* 08000-0bfff empty */
  1117.     ROM_LOAD( "chv1-v.2v",    0x0c000, 0x4000, 0xa0fd7338 )
  1118.     ROM_LOAD( "chv1-v.3r",    0x10000, 0x4000, 0x690e26fb )
  1119.     ROM_LOAD( "chv1-v.3t",    0x14000, 0x4000, 0xea5d7759 )
  1120.     /* 18000-1bfff empty */
  1121.     ROM_LOAD( "chv1-v.3v",    0x1c000, 0x4000, 0xceb37c05 )
  1122.     ROM_LOAD( "chv1-v.4r",    0x20000, 0x4000, 0xe291cba0 )
  1123.     ROM_LOAD( "chv1-v.4t",    0x24000, 0x4000, 0xe01f3b59 )
  1124.     /* 28000-2bfff empty */
  1125.     /* 2c000-2ffff empty (4v doesn't exist, it is seen as a 0xff fill) */
  1126.  
  1127.     ROM_REGION( 0x10000, REGION_GFX4 | REGIONFLAG_DISPOSE )
  1128.     ROM_LOAD( "chv1-v.6p",    0x00000, 0x2000, 0xd834e142 )    /* chars #4 */
  1129.     /* 02000-03fff empty (space for 16k ROM) */
  1130.     /* 04000-07fff empty (space for 6l and 6k) */
  1131.     ROM_LOAD( "chv1-v.8p",    0x08000, 0x2000, 0xa2f531db )
  1132.     /* 0a000-0bfff empty (space for 16k ROM) */
  1133.     /* 0c000-0ffff empty (space for 8l and 8k) */
  1134.  
  1135.     ROM_REGION( 0x0e00, REGION_PROMS )
  1136.     ROM_LOAD( "chpv-b.7b",    0x0000, 0x0200, 0xdf6fdeb3 )    /* red component */
  1137.     ROM_LOAD( "chpv-b.4b",    0x0200, 0x0200, 0x9d51416e )    /* red component */
  1138.     ROM_LOAD( "chpv-b.7c",    0x0400, 0x0200, 0xb1da5f42 )    /* green component */
  1139.     ROM_LOAD( "chpv-b.4c",    0x0600, 0x0200, 0xb8a25795 )    /* green component */
  1140.     ROM_LOAD( "chpv-b.7d",    0x0800, 0x0200, 0x4ede813e )    /* blue component */
  1141.     ROM_LOAD( "chpv-b.4d",    0x0a00, 0x0200, 0x474fc3b1 )    /* blue component */
  1142.     ROM_LOAD( "chv1-b.3c",    0x0c00, 0x0100, 0xc3f92ea2 )    /* priority encoder - not used */
  1143.     ROM_LOAD( "chpv-v.2d",    0x0d00, 0x0100, 0x71dc0d48 )    /* timing - not used */
  1144.  
  1145.     ROM_REGION( 0x10000, REGION_SOUND1 )    /* 64k for the VLM5030 data */
  1146.     ROM_LOAD( "chv1-c.6p",    0x0000, 0x4000, 0x31b52896 )
  1147. ROM_END
  1148.  
  1149.  
  1150.  
  1151. GAME( 1984, punchout, 0,        punchout, punchout, punchout, ROT0, "Nintendo", "Punch-Out!!" )
  1152. GAME( 1984, spnchout, 0,        punchout, spnchout, spnchout, ROT0, "Nintendo", "Super Punch-Out!!" )
  1153. GAME( 1984, spnchotj, spnchout, punchout, spnchout, spnchotj, ROT0, "Nintendo", "Super Punch-Out!! (Japan)" )
  1154. GAME( 1985, armwrest, 0,        armwrest, armwrest, armwrest, ROT0, "Nintendo", "Arm Wrestling" )
  1155.